home *** CD-ROM | disk | FTP | other *** search
/ Shareware Extravaganza - Disc 1 / ShareWare Extravaganza 1 of 4 (The Ultimate Shareware Company).iso / grprogs / picutil.exe / PERCENT.ASM < prev    next >
Assembly Source File  |  1986-09-08  |  17KB  |  464 lines

  1. ;╔═════════════════════════════════════════════════════════════════════════════╗
  2. ;║ ░░░░░░░░░░░ PROGRAM = PERCENT.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  3. ;╚═════════════════════════════════════════════════════════════════════════════╝
  4. CSEG           SEGMENT PUBLIC BYTE
  5.            ASSUME  CS:CSEG,DS:CSEG
  6.  
  7. CR           EQU     0DH
  8. LF           EQU     0AH
  9.  
  10. FILENAME       DB      128 DUP(0)
  11. HANDLE_IN      DW      0
  12.  
  13. BYTE_CNT_H     DW      0
  14. BYTE_CNT_L     DW      0
  15.  
  16. PIXEL_COUNT    DW      0
  17.            DW      0
  18.            DW      0
  19.  
  20. LINES_PER_READ DW      0
  21. READS_PER_FILE DW      0
  22. BYTES_PER_READ DW      0
  23.  
  24. DISK_BUFFER    DD      0
  25.  
  26. ;44 BYTES
  27. IMG_NAME       DB      'FILE GENERATED FROM PCPAINT   '
  28. IMG_HEIGHT     DW      0
  29. IMG_WIDTH      DW      0
  30. IMG_WIDTH_BYTE DW      0
  31. IMG_PIX_SIZE   DW      1
  32. IMG_PIX_FMT    DW      0
  33. IMG_COLOR      DW      0
  34. IMG_COMPRESS   DW      0
  35.  
  36. CRLF           DB      CR,LF,'$'
  37. TELL_HOW       DB      '┌──────────────────────────────────────────────┐',cr,lf
  38.            DB      '│ PERCENT filename.typ                         │',cr,lf
  39.            DB      '├──────────────────────────────────────────────┤',cr,lf
  40.            DB      '│ TELLS PERCENT OF PIXELS ON                   │',cr,lf
  41.            DB      '└──────────────────────────────────────────────┘',cr,lf
  42.            DB      7,'$'
  43. OPEN_ERROR     DB      'file not found...must end in GMI',cr,lf,'$'
  44. CREATE_ERROR   DB      'create error on output file',cr,lf,'$'
  45. PROMPT1        DB      CR,LF,'NUMBER OF PIXELS IN FILE (HEX) $'
  46. PROMPT2        DB      CR,LF,'NUMBER OF PIXELS ON (HEX)      $'
  47. PROMPT3        DB      CR,LF,'PERCENT OF PIXELS ON (HEX)     $'
  48.  
  49.  
  50. ;╔═════════════════════════════════════════════════════════════════════════════╗
  51. ;║ ░░░░░░░░░░░ MAIN.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  52. ;╚═════════════════════════════════════════════════════════════════════════════╝
  53. MAIN           PROC    FAR
  54. ;┌─────────────────────────────────────────────────────────────────────────────┐
  55. ;│           RETURN SETUP                               │
  56. ;└─────────────────────────────────────────────────────────────────────────────┘
  57.            CLI
  58.            MOV     AX,CS               ;TEMP STACK
  59.            MOV     SS,AX               ;
  60.            MOV     ES,AX               ;
  61.            MOV     SP,OFFSET STACK           ;
  62.            STI
  63.            PUSH    DS               ;
  64.            XOR     AX,AX               ;
  65.            PUSH    AX               ;
  66.            CLD
  67. ;┌─────────────────────────────────────────────────────────────────────────────┐
  68. ;│           GET FILENAME FROM COMMAND LINE                       │
  69. ;└─────────────────────────────────────────────────────────────────────────────┘
  70.            MOV     SI,82H               ;START OF FILENAME
  71.            XOR     CH,CH               ;
  72.            MOV     CL,DS:[SI-2]           ;SIZE OF FILENAME
  73.            CMP     CX,0               ;NO COMMANDS
  74.            JE      GFN800               ;ERROR
  75.            MOV     DI,OFFSET FILENAME      ;STORE FILENAME HERE
  76. GFN100:
  77.            LODSB                   ;GET CHARACTER
  78.            CMP     AL,20H               ;END OF FILENAME?
  79.            JE      GFN900               ;YES....BRANCH
  80.            CMP     AL,CR               ;END OF COMMAND LINE?
  81.            JE      GFN900               ;YES....ERROR
  82.            STOSB                   ;SAVE CHARACTER
  83.            LOOP    GFN100               ;GET ANOTHER CHARACTER
  84. GFN800:
  85.            MOV     DX,OFFSET TELL_HOW      ;
  86.            JMP     ERROR               ;
  87. GFN900:
  88.            MOV     AL,0               ;PUT NULL AT END OF STRING
  89.            STOSB                   ;
  90. ;┌─────────────────────────────────────────────────────────────────────────────┐
  91. ;│           TURN BREAK KEY ON                           │
  92. ;└─────────────────────────────────────────────────────────────────────────────┘
  93. SET_BREAK:
  94.            MOV     AX,CS               ;SET DATA SEGMENT
  95.            MOV     DS,AX               ;
  96.            CALL    BREAK_ON            ;SET UP CONTROL BREAK
  97. ;┌─────────────────────────────────────────────────────────────────────────────┐
  98. ;│           FIND DISK MEMORY                            │
  99. ;└─────────────────────────────────────────────────────────────────────────────┘
  100.            MOV     AX,OFFSET PROG_END      ;
  101.            MOV     BX,CS               ;
  102.            SHR     AX,1               ;
  103.            SHR     AX,1               ;
  104.            SHR     AX,1               ;
  105.            SHR     AX,1               ;
  106.            ADD     BX,AX               ;
  107.            ADD     BX,8               ;
  108.            MOV     WORD PTR DISK_BUFFER+2,BX      ;
  109. ;┌─────────────────────────────────────────────────────────────────────────────┐
  110. ;│           OPEN INPUT FILE                               │
  111. ;└─────────────────────────────────────────────────────────────────────────────┘
  112.            MOV     AH,3DH               ;OPEN FILE FOR READ
  113.            MOV     AL,0H               ;
  114.            MOV     DX,OFFSET FILENAME      ;
  115.            INT     21H               ;
  116.            JNC     OIF100
  117. OIF050:
  118.            MOV     DX,OFFSET OPEN_ERROR    ;
  119.            JMP     ERROR
  120. OIF100:
  121.            MOV     HANDLE_IN,AX
  122. ;┌─────────────────────────────────────────────────────────────────────────────┐
  123. ;│           READ IMG HEADER                               │
  124. ;└─────────────────────────────────────────────────────────────────────────────┘
  125.            MOV     AH,3FH
  126.            MOV     BX,HANDLE_IN
  127.            MOV     CX,44
  128.            MOV     DX,OFFSET IMG_NAME
  129.            INT     21H
  130. ;┌─────────────────────────────────────────────────────────────────────────────┐
  131. ;│           MOVE PICTURE DATA BETWEEN FILES                       │
  132. ;└─────────────────────────────────────────────────────────────────────────────┘
  133. PROCESS_PAC:
  134.  
  135.            CALL    READ_IMAGE
  136.            CMP     AX,0
  137.            JE      PP200
  138.            CALL    COUNT_PIX
  139.            JMP     SHORT PROCESS_PAC
  140. ;┌─────────────────────────────────────────────────────────────────────────────┐
  141. ;│           PRINT FINDINGS                               │
  142. ;└─────────────────────────────────────────────────────────────────────────────┘
  143. PP200:
  144.            MOV     DX,OFFSET PROMPT1       ;TOTAL NUMBER OF PIXELS IN FILE
  145.            MOV     AH,9
  146.            INT     21H
  147.  
  148.            MOV     AX,IMG_WIDTH_BYTE       ;HEIGHT * WIDTH
  149.            SHL     AX,1
  150.            SHL     AX,1
  151.            SHL     AX,1
  152.            MUL     IMG_HEIGHT
  153.  
  154.            XCHG    DX,AX
  155.            CALL    BIN2HEX
  156.            XCHG    DX,AX
  157.            CALL    BIN2HEX
  158.  
  159.            MOV     DX,OFFSET PROMPT2
  160.            MOV     AH,9
  161.            INT     21H
  162.  
  163. ;           MOV     AX,PIXEL_COUNT+4
  164. ;           CALL    BIN2HEX
  165.            MOV     AX,PIXEL_COUNT+2
  166.            CALL    BIN2HEX
  167.            MOV     AX,PIXEL_COUNT
  168.            CALL    BIN2HEX
  169. ;┌─────────────────────────────────────────────────────────────────────────────┐
  170. ;│           CLOSE FILES                               │
  171. ;└─────────────────────────────────────────────────────────────────────────────┘
  172. CLOSE_FILE:
  173.            MOV     BX,HANDLE_IN           ;CLOSE FILE
  174.            MOV     AH,3EH               ;
  175.            INT     21H               ;
  176.            JMP     EXIT
  177. ERROR:
  178.            MOV     AX,CS
  179.            MOV     DS,AX
  180.            MOV     AH,9
  181.            INT     21H
  182. EXIT:
  183.            CALL    BREAK_OFF           ;BREAK KEY RESET
  184.            RET                   ;
  185. MAIN           ENDP
  186.  
  187. ;╔═════════════════════════════════════════════════════════════════════════════╗
  188. ;║ ░░░░░░░░░░░ COUNT PIX ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  189. ;╚═════════════════════════════════════════════════════════════════════════════╝
  190. ;┌─────────────────────────────────────────────────────────────────────────────┐
  191. ;│           AX= NUMBER OF BYTES TO COUNT PIXELS                   │
  192. ;└─────────────────────────────────────────────────────────────────────────────┘
  193.  
  194. COUNT_PIX      PROC    NEAR
  195.  
  196.            PUSH    AX               ;SAVE REGISTERS
  197.            PUSH    BX               ;
  198.            PUSH    CX               ;
  199.            PUSH    DX               ;
  200.            PUSH    DI               ;
  201.            PUSH    SI               ;
  202.            PUSH    DS               ;
  203.            PUSH    ES               ;
  204.            cld
  205. ;┌─────────────────────────────────────────────────────────────────────────────┐
  206. ;│           CLEAR FLAGS BUFFER                           │
  207. ;└─────────────────────────────────────────────────────────────────────────────┘
  208.            PUSH    AX
  209.            MOV     AX,CS
  210.            MOV     ES,AX
  211.            MOV     DS,AX
  212.            XOR     AX,AX
  213.            MOV     DI,OFFSET FLAGS
  214.            MOV     CX,256
  215.            REP     STOSW
  216.            POP     AX
  217.  
  218. ;┌─────────────────────────────────────────────────────────────────────────────┐
  219. ;│           SORT BYTES IN FILE                          │
  220. ;└─────────────────────────────────────────────────────────────────────────────┘
  221.            MOV     CX,AX               ;USE AS COUNTER
  222.            PUSH    DS
  223.            LDS     SI,DISK_BUFFER           ;FLAG ANY CHARACTER USED
  224.            MOV     DI,OFFSET FLAGS           ;
  225. FC400:
  226.            LODSB                   ;GET CHARACTER
  227.            MOV     BL,AL               ;SETUP OFFSET WITH CHARACTER
  228.            XOR     BH,BH               ;
  229.            SHL     BX,1
  230.            INC     WORD PTR ES:[DI+BX]     ;SET FLAG FOR CHARACTER
  231.            LOOP    FC400               ;DO UNTIL DONE
  232.            POP     DS
  233.  
  234. ;┌─────────────────────────────────────────────────────────────────────────────┐
  235. ;│           COUNT ON PIXELS                               │
  236. ;└─────────────────────────────────────────────────────────────────────────────┘
  237. FC550:
  238.            MOV     CX,256
  239.            XOR     BX,BX
  240.            MOV     SI,OFFSET BIT_TABLE
  241.            MOV     DI,OFFSET FLAGS
  242.  
  243.  
  244. FC575:
  245.            PUSH    BX
  246.            SHL     BX,1
  247.            MOV     AX,[DI+BX]           ;GET NUMBER OF BYTES OF SAME
  248.            POP     BX
  249.            MOV     DL,[SI+BX]
  250.            XOR     DH,DH
  251.            MUL     DX
  252.            ADD     PIXEL_COUNT,AX
  253.            JNC     FC600
  254.            CLC
  255.            INC     PIXEL_COUNT+2
  256.            JNC     FC600
  257.            INC     PIXEL_COUNT+4
  258. FC600:
  259.            ADD     PIXEL_COUNT+2,DX
  260.            JNC     FC700
  261.            INC     PIXEL_COUNT+4
  262. FC700:
  263.            INC     BX
  264.            LOOP    FC575
  265.            POP     ES               ;RESTORE REGISTERS
  266.            POP     DS               ;
  267.            POP     SI               ;
  268.            POP     DI               ;
  269.            POP     DX               ;
  270.            POP     CX               ;
  271.            POP     BX               ;
  272.            POP     AX               ;
  273.            RET
  274.  
  275. COUNT_PIX      ENDP
  276. ;╔═════════════════════════════════════════════════════════════════════════════╗
  277. ;║ ░░░░░░░░░░░ READ IMAGE  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  278. ;╚═════════════════════════════════════════════════════════════════════════════╝
  279. READ_IMAGE     PROC    NEAR
  280.  
  281.            PUSH    BX               ;
  282.            PUSH    CX               ;
  283.            PUSH    DX               ;
  284.            PUSH    DS
  285.  
  286.            MOV     AH,3FH               ;
  287.            MOV     BX,HANDLE_IN           ;
  288.            MOV     CX,8000H            ;
  289.            LDS     DX,DISK_BUFFER           ;
  290.            INT     21H               ;
  291.  
  292.            POP     DS
  293.            POP     DX               ;RESTORE REGISTERS
  294.            POP     CX               ;
  295.            POP     BX               ;
  296.            RET
  297.  
  298. READ_IMAGE     ENDP
  299. ;┌─────────────────────────────────────────────────────────────────────────────┐
  300. ;└─────────────────────────────────────────────────────────────────────────────┘
  301. EOI          EQU      20H              ;END OF INTERRUPT
  302. BRKINT          EQU      1BH              ;BREAK INTERRUPT
  303. SAV_BRK       DW       ?
  304. ;╔═════════════════════════════════════════════════════════════════════════════╗
  305. ;║ ░░░░░░░░░░ BREAK_ON ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  306. ;╚═════════════════════════════════════════════════════════════════════════════╝
  307.           PUBLIC   BREAK_ON
  308. BREAK_ON      PROC     NEAR
  309.           PUSH     AX
  310.           PUSH     BX               ;SAVE REGISTERS
  311.           PUSH     CX               ;
  312.           PUSH     DX               ;
  313.           PUSH     SI               ;
  314.           PUSH     ES               ;
  315.  
  316.           XOR      BX,BX               ;SEGMENT 0
  317.           MOV      ES,BX               ;
  318.           MOV      SI,BRKINT*4           ;OFFSET OF INTERUPT VECTOR
  319.  
  320.           MOV      CX,ES:WORD PTR[SI]      ;OFFSET OF CURRENT VECT
  321.           MOV      DX,ES:WORD PTR[SI+2]    ;SEGMENT OF CURRENT VECT
  322.           MOV      CS:SAV_BRK,CX           ;SAVE OFFSET
  323.           MOV      CS:SAV_BRK+2,DX           ;SAVE SEGMENT
  324.  
  325.           MOV      AX,OFFSET BREAK           ;
  326.           CLI                   ;NO INTERRUPTS
  327.           MOV      ES:WORD PTR[SI],AX      ;SET OFFSET
  328.           MOV      AX,CS               ;SET THIS CODE SEGMENT
  329.           MOV      ES:WORD PTR[SI+2],AX    ;MOVE SEG ADDR TO INT.VECT
  330.           STI                   ;INTERRUPTS BACK ON
  331.  
  332.           POP      ES               ;RESTORE REGISTERS
  333.           POP      SI               ;
  334.           POP      DX               ;
  335.           POP      CX               ;
  336.           POP      BX               ;
  337.           POP      AX               ;
  338.           RET                   ;
  339. BREAK_ON      ENDP
  340. ;╔═════════════════════════════════════════════════════════════════════════════╗
  341. ;║ ░░░░░░░░░░ BREAK_OFF ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  342. ;╚═════════════════════════════════════════════════════════════════════════════╝
  343.           PUBLIC   BREAK_OFF
  344. BREAK_OFF     PROC     NEAR
  345.  
  346.           PUSH     AX               ;
  347.           PUSH     CX               ;
  348.           PUSH     DX               ;
  349.           PUSH     DI               ;
  350.           PUSH     ES               ;
  351.  
  352.           XOR      AX,AX               ;
  353.           MOV      ES,AX               ;SEGMENT 0
  354.           MOV      CX,CS:SAV_BRK           ;RESET VECTOR BACK TO OLD RTN
  355.           MOV      DX,CS:SAV_BRK+2           ;
  356.           MOV      DI,BRKINT*4           ;
  357.           CLI                   ;NO INTERRUPTS
  358.           MOV      ES:WORD PTR[DI],CX      ;
  359.           MOV      ES:WORD PTR[DI+2],DX    ;
  360.           STI                   ;INTERRUPTS BACK ON
  361.  
  362.           POP      ES               ;
  363.           POP      DI               ;
  364.           POP      DX               ;
  365.           POP      CX               ;
  366.           POP      AX               ;
  367.           RET                   ;
  368. BREAK_OFF     ENDP
  369. ;╔═════════════════════════════════════════════════════════════════════════════╗
  370. ;║ ░░░░░░░░░░ BREAK ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║ J
  371. ;╚═════════════════════════════════════════════════════════════════════════════╝
  372.           PUBLIC   BREAK
  373. BREAK          PROC     FAR
  374.  
  375.           MOV      AX,CS
  376.           MOV      DS,AX
  377.           MOV      AL,EOI               ;
  378.           OUT      020H,AL               ;
  379.           CALL     BREAK_OFF
  380.           MOV      SP,OFFSET STACK-4       ;
  381.           RET
  382.  
  383. BREAK          ENDP
  384.  
  385. ;╔═════════════════════════════════════════════════════════════════════════════╗
  386. ;║ ░░░░░░░░░░░ BIN2HEX ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  387. ;╚═════════════════════════════════════════════════════════════════════════════╝
  388. ;┌─────────────────────────────────────────────────────────────────────────────┐
  389. ;│           AX = HEX WORD                               │
  390. ;└─────────────────────────────────────────────────────────────────────────────┘
  391. BIN2HEX        PROC    NEAR
  392.  
  393.            PUSH    AX
  394.            PUSH    DX
  395.            MOV     DL,AH
  396.            CALL    HEX
  397.            MOV     DL,AL
  398.            CALL    HEX
  399.            POP     DX
  400.            POP     AX
  401.            RET
  402. BIN2HEX        ENDP
  403. ;╔═════════════════════════════════════════════════════════════════════════════╗
  404. ;║ ░░░░░░░░░░░ HEX OUT░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  405. ;╚═════════════════════════════════════════════════════════════════════════════╝
  406. ;┌─────────────────────────────────────────────────────────────────────────────┐
  407. ;│           DL = CHARACTER                               │
  408. ;└─────────────────────────────────────────────────────────────────────────────┘
  409. HEX           PROC    NEAR
  410.  
  411.            PUSH    AX
  412.            PUSH    DX
  413.            MOV     DH,DL
  414.            AND     DL,0F0H
  415.            SHR     DL,1
  416.            SHR     DL,1
  417.            SHR     DL,1
  418.            SHR     DL,1
  419.            CMP     DL,10
  420.            JB      H100
  421.            ADD     DL,7
  422. H100:
  423.            ADD     DL,30H
  424.            MOV     AH,2
  425.            INT     21H
  426.            MOV     DL,DH
  427.            AND     DL,0FH
  428.            CMP     DL,10
  429.            JB      H200
  430.            ADD     DL,7
  431. H200:
  432.            ADD     DL,30H
  433.            MOV     AH,2
  434.            INT     21H
  435.            POP     DX
  436.            POP     AX
  437.            RET
  438.  
  439. HEX           ENDP
  440. ;┌─────────────────────────────────────────────────────────────────────────────┐
  441. ;└─────────────────────────────────────────────────────────────────────────────┘
  442. BIT_TABLE      DB      0,1,1,2,1,2,2,3,1,2,2,3,3,3,3,4
  443.            DB      1,2,2,3,2,3,3,4,2,3,3,4,4,4,4,5
  444.            DB      1,2,2,3,2,3,3,4,2,3,3,4,4,4,4,5
  445.            DB      2,3,3,4,3,4,4,5,3,4,4,5,5,5,5,6
  446.            DB      1,2,2,3,2,3,3,4,2,3,3,4,4,4,4,5
  447.            DB      2,3,3,4,3,4,4,5,3,4,4,5,5,5,5,6
  448.            DB      2,3,3,4,3,4,4,5,3,4,4,5,5,5,5,6
  449.            DB      3,4,4,5,4,5,5,6,4,5,5,6,6,6,6,7
  450.            DB      1,2,2,3,2,3,3,4,2,3,3,4,4,4,4,5
  451.            DB      2,3,3,4,3,4,4,5,3,4,4,5,5,5,5,6
  452.            DB      2,3,3,4,3,4,4,5,3,4,4,5,5,5,5,6
  453.            DB      3,4,4,5,4,5,5,6,4,5,5,6,6,6,6,7
  454.            DB      3,4,4,5,4,5,5,6,4,5,5,6,6,6,6,7
  455.            DB      3,4,4,5,4,5,5,6,4,5,5,6,6,6,6,7
  456.            DB      3,4,4,5,4,5,5,6,4,5,5,6,6,6,6,7
  457.            DB      4,5,5,6,5,6,6,7,5,6,6,7,7,7,7,8
  458. FLAGS           DW      256 DUP(0)
  459.            DB      64 DUP('STACK')
  460. STACK           EQU     $
  461. PROG_END       EQU     $
  462. CSEG           ENDS
  463.            END     MAIN
  464.